/**
 * 
 */
package cn.biplam.back.sql.ddl;

import java.io.Serializable;
import java.util.ArrayList;

import cn.biplam.common.client.DbResource;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;

/**
 * 数据库语义模型<br>
 * <ul>数据库模型包含的对象有：
 *  <li> 表
 *  <li> 数据源
 * </ul> 
 * 
 * @author 	WangSong 2009-3-27 下午04:04:19
 * @version 1.0
 */
public class Database implements Serializable {
	
	private static final long serialVersionUID = 1294289205010647917L;
	/**数据库对象中存放表的容器*/
	private ArrayList<Table> tables=null;
	/** 表顺序索引,表名和表顺序号 */
	private KvMap<Integer,String> tableIndex=null;
	/** 表计数器 */
	private int iTableCount=0;
	/**数据源信息*/
	private DbResource mDbResource;
	/**物理名称*/
	private String sPhysicalName=null;
	/** 当前访问表记录号 */
	private int iCurrentTableCount=0;
	
	/**
	 * 创建数据库
	 * @param sPhysicalName 数据库名
	 */
	public Database(String sPhysicalName){
			this(null,sPhysicalName,null);
	}
	
	/**
	 * 创建数据库
	 * @param dbResource    数据源          
	 * @param sPhysicalName 物理名称
	 */
	public Database(DbResource dbResource,String sPhysicalName){
		this(dbResource,sPhysicalName,null);
	}
	
	/**
	 * 创建数据库
	 * @param dbResource    数据源
	 * @param sPhysicalName 物理名词
	 * @param sLogicName    逻辑名称
	 */
	public Database(DbResource dbResource,String sPhysicalName,String sLogicName){
		this.mDbResource=dbResource;
		this.setPhysicalName(sPhysicalName);
		_init();
	}
	
	/**
	 * 初始化
	 */
	private void _init(){
		tables=new ArrayList<Table>();
		tableIndex=new KvMap<Integer,String>();
	}
	
	/**
	 *	@deprecated  
	 */
	public void put(Structure table) throws ErrorMessage {
		throw new ErrorMessage("此方法已经停用");
	}
	
	/**
	 * 插入一个Table
	 * @param table	Table对象
	 * @throws ErrorMessage
	 */
	public void put(Table table) throws ErrorMessage {
		String name=table.getPhysicalName();
		tables.add(table);
		tableIndex.put(iTableCount,name);
		iTableCount++;
	}
	
	/**
	 * 返回Database下的所有表
	 * @return Table集合
	 */
	public ArrayList<Table> getTableSet(){
		return this.tables;
	}

	/**
	 * 当前访问表的光标是否到末尾
	 * @return
	 */
	public boolean haveNext(){
		return this.iCurrentTableCount<this.iTableCount;
	}
	
	/**
	 * 获取数据库下的一个表格
	 * @return
	 */
	public Table get(){
		return this.tables.get(this.iCurrentTableCount++);
	}
	
	/**
	 * 返回物理名称
	 * @return	物理名称
	 */
	public String getPhysicalName() {
		return this.sPhysicalName;
	}
	
	/**
	 * 设置物理名称
	 * @param physicalName
	 */
	public void setPhysicalName(String physicalName) {
		this.sPhysicalName=physicalName;
	}

	/**
	 * 返回元数据库数据源
	 * @return	元数据库数据源
	 */
	public DbResource getMDbResource() {
		return mDbResource;
	}

	/**
	 * 设置元数据库数据源
	 * @param dbResource
	 */
	public void setMDbResource(DbResource dbResource) {
		mDbResource = dbResource;
	}

	/**
	 * 返回表数量
	 * @return	表数量
	 */
	public int getTableCount() {
		return iTableCount;
	}
}
